/**
|--------------------------------------------------
| 给你一个整数数组 nums ，找到其中最长严格递增子序列的长度。

子序列 是由数组派生而来的序列，删除（或不删除）
数组中的元素而不改变其余元素的顺序。
例如，[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
输入：nums = [10,9,2,5,3,7,101,18]
输出：4
解释：最长递增子序列是 [2,3,7,101]，因此长度为 4 。
输入：nums = [0,1,0,3,2,3]
输出：4
输入：nums = [7,7,7,7,7,7,7]
输出：1
|--------------------------------------------------
*/

/*
! 动态规划四要素
状态;
方程;
初始化;
答案;
 * @param {*} nums 
 * @returns 
 */
var lengthOfLIS = function (nums) {
  //初始化
  let dp = new Array(nums.length).fill(1);

  for (let i = 0; i < nums.length; i++) {
    for (let j = 0; j < i; j++) {
      //如果当前值比前面的值小 则继续判断
      if (nums[i] > nums[j]) {
        // 状态 f[i] 表示 跳到i的步数 最多用了多少步
        //状态以及 状态转移方程
        dp[i] = Math.max(dp[i], dp[j] + 1);
      }
    }
  }

  //答案
  let max = 0;
  for (let i = 0; i < dp.length; i++) {
    max = Math.max(max, dp[i]);
  }
  //返回最大值
  return max;
};
